package Ueb03;
import de.htw.saarland.stl.*;

/**
 * Testklasse zum testen der Methoden der Klasse Math
 * 
 * @author Andreas Schreiner
 * @author Kevin Morsch
 * @version 1
 */

public class MathTest
{
    private static final int BEENDEN     = 0;
    private static final int TEILERMENGE = 1;
    private static final int PRIMZAHL    = 2;
    private static final int QUADRATISCH = 3;
    private static final int CLEAR = 4;
    private static int varClear = 0;
    private static String strClear = " Clear aktivieren\n";

    /**
     * Hauptmethode der MathTest Klasse, die ein neues Objekt MathTest erstellt mit dem gearbeitet wird
     */
    public static  void main(String[] args){
        MathTest m1 = new MathTest();
        m1.start();
    }

    /**
     * Einlese-Funktion des Menues, zur weiteren Verarbeitung, je nachdem welchen Menuepunkt der
     * User gewählt hat.
     * 
     * @return Gibt aus welche Funktion der Benutzer gewählt hat
     */
    private int einlesenFunktion()
    {
        System.out.println(TEILERMENGE + " Teilermenge\n" + 
            PRIMZAHL + " Primzahl\n" + 
            QUADRATISCH +" Quadratische Gleichung (a0x² + a1x + a2)\n" +
            CLEAR + strClear +
            BEENDEN + " Beenden\n"); 
        return Stdin.readlnInt("Menuepunkt waehlen:");
    }

    /**
     * Try-Catch Methode zum Auffangen von Error und Exception, damit das Programm nicht sofort
     * beendet wird.
     * 
     * @param funktion Der eingegebene Menuewert zwischen 0 und 4, der, solange er ungleich 0 ist das Programm weiterlaufen lässt.
     */
    public void start()
    {
        int funktion = -1;
        while (funktion != 0)
        {
            try{
                funktion = einlesenFunktion();
                if ( varClear == 1){
                    Runtime.getRuntime().exec("clear");
                }
                ausfuehrenFunktion(funktion);
            }
            catch(AssertionError e)
            {
                System.out.println(e);
            }
            catch (Exception e)
            {
                System.out.println(e);
                e.printStackTrace();
            }
        }
    }

    /**
     * Wurde ein Menuepunkt gewählt wird hier über die entsprechende case-Verzweigung im switch-Befehl die passende Berechnung ausgewählt und die benötigten Werte werden
     * abgefragt.
     * 
     * Bei jeder Werteabfrage wird geprüft, ob die Eingabe des Benutzers auch zulässig ist.
     * 
     * @param numT Bestätigungsvariable, die die Schleife beendet wenn sie für die gesamte Funktion der Teilermenge inklusive Fehlerabfänger durchgelaufen ist.
     * @param numP Bestätigungsvariable, die die Schleife beendet wenn sie für die gesamte Funktion der Primzahl inklusive Fehlerabfänger durchgelaufen ist.
     * @param numQ Bestätigungsvariable, die die Schleife beendet wenn sie für die gesamte Funktion der Quadratischen Gleichung inklusive Fehlerabfänger durchgelaufen ist.
     */
    
    public void ausfuehrenFunktion(int funktion)
    {
        switch(funktion){

            case BEENDEN:
            System.out.println("Programm Ende");
            break;

            case TEILERMENGE:
            int numT = 0;
            while( numT == 0){

                try{

                    Teiler.teilermengenZahl = Stdin.readlnInt("Von welcher Zahl soll die Teilermenge bestimmt werden?\n-->:");
                    Teiler.Teilermenge();
                    System.out.println("-->: " + Teiler.ergebniss +'\n');
                    numT = 1;
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }  
            }
            break;

            case PRIMZAHL:
            int numP = 0;
            while( numP == 0){

                try{

                    Prim.primZahl = Stdin.readlnInt("Welche Zahl soll auf eine Primzahl geprueft werden? \n-->:");
                    Prim.strPrim(); 
                    System.out.println("-->: " + Prim.strErgebniss + '\n');
                    numP = 1;
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }

            }
            break;

            case QUADRATISCH:
            int numQ0 = 0;
            int numQ1 = 0;
            int test;
            while( numQ0 == 0){

                try{
                    System.out.print("Bitte a0, a1, a2 eingeben\n");
                    Quadr.QuadrA = Stdin.readlnDouble("a0= ");
                    assert Quadr.QuadrA != 0;
                    while (numQ1 == 0){
                        try{
                            Quadr.QuadrB = Stdin.readlnDouble("a1= ");
                            test = (int)Quadr.QuadrB + 1;
                            numQ1 = 1;
                        }
                        catch(AssertionError e)
                        {
                            System.out.println(e);
                        }
                        catch (Exception e)
                        {
                            System.out.println(e);
                            e.printStackTrace();
                        }
                    }
                    while(numQ0 ==0){
                        try{
                            Quadr.QuadrC = Stdin.readlnDouble("a2= ");
                            test = (int)Quadr.QuadrC + 1;
                            Quadr.QuadratischeFunct();                                        
                            System.out.println("-->" + Quadr.Ausgabe + '\n');
                            numQ0 = 1;
                        }
                        catch(AssertionError e)
                        {
                            System.out.println(e);
                        }
                        catch (Exception e)
                        {
                            System.out.println(e);
                            e.printStackTrace();
                        }

                    }
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }  
            }            
            break;
            
            case CLEAR: {
                        if (varClear == 1){
                            varClear = 0;
            strClear = " Clear aktivieren\n";
        }
        else{
            varClear = 1;
            strClear = " Clear deaktivieren\n";
        }
        break;
      }
            
            default:
            System.out.println("Falsche Eingabe!");
            break;
        }
    }
}